const Service = require('egg').Service;
const _ = require('lodash');
const Parameter = require('parameter');
const parameter = new Parameter();

class MessageService extends Service {
    // 默认不需要提供构造函数。
    // constructor(ctx) {
    //   super(ctx); 如果需要在构造函数做一些处理，一定要有这句话，才能保证后面 `this.ctx`的使用。
    //   // 就可以直接通过 this.ctx 获取 ctx 了
    //   // 还可以直接通过 this.app 获取 app 了
    // }
    async get(id) {
    }

    /**
     * 更新用户的新消息字段
     * @param userId
     * @returns {Promise<boolean>}
     */
    async updateUnreadMessage(userId = null) {
        userId = userId || this.ctx.user.id;
        const user = this.app.model.User.build({id: userId}, {isNewRecord: false});
        const hasUnreadMessage = await user.countUnreadMessage() > 0;
        if (hasUnreadMessage) {
            user.update({message: true});
        } else {
            user.update({message: false});
        }
        return hasUnreadMessage;
    }

    /**
     * 发送短消息
     * @param data
     * @returns {Promise<>}
     */
    async send(data = {from: undefined, to: undefined, title: undefined, content: undefined}) {
        let {from, to, title, content} = data;

        if (!from)
            return this.ctx.helper.error('短消息 发送者 不能为空');
        else if (from.id)
            from = from.id;

        if (!to)
            return this.ctx.helper.error('短消息 接收者 不能为空');

        if (!content || _.isEmpty(content))
            return this.ctx.helper.error('短消息 内容不能为空');


        //过滤数组
        if (_.isArray(to)) {
            to = to.map(to => {
                if (_.isNumber(to))
                    return to;
                if (to.id)
                    return to.id;
            });
        } else if (to.id) {
            to = [to.id];
        } else {
            to = [to];
        }

        //删除false,null,undefined,0,''
        //https://lodash.com/docs/#compact
        to = _.compact(_.uniq(to));

        if (_.isEmpty(to))
            return this.ctx.helper.error('短消息接收者不能为空');

        if (to.indexOf(1) >= 0)
            return this.ctx.helper.error('不能给 系统 发短消息');
        if (to.indexOf(from) >= 0)
            return this.ctx.helper.error(' 发送者 与接受者 不能为同一个人');

        if (_.isEmpty(title))
            return this.ctx.helper.error('请填入标题');
        else if (_.isEmpty(content))
            return this.ctx.helper.error('请填入内容');

        const message = await this.app.model.Message.create({title, content, from_id: from,});
        message.addReceiver([to]);

        //短信息接收者的新消息数量为1
        await this.app.model.User.update(
            {message: 1},
            {where: {id: {[this.app.Sequelize.Op.and]: to}}}
        );
        return true;
    }
}

module.exports = MessageService;